home *** CD-ROM | disk | FTP | other *** search
- {***************************************************}
- { AutoRemoveDemo.PAS }
- { }
- { Dieses Programm demonstiert in HighSpeed-Pascal }
- { die Nutzung von Message-Ports. }
- { Zunächst überprüft es, ob das Programm schon }
- { läuft. Wenn nicht, öffnet es ein Fenster und }
- { wartet auf eine Nachricht. Ansonsten schickt es }
- { eine Mitteilung an das schon gestartete Programm, }
- { woraufhin beide Programme terminieren }
- {***************************************************}
-
- PROGRAM AutoRemoveDemo;
-
- uses
- Exec, Intuition, Graphics; { Amiga-Strukturen }
-
- VAR
- MyWindow : tNewWindow; { NewWindow-Struktur }
- Window : pWindow; { Zeiger aufs Fenster }
-
- NewPort : tMsgPort; { Erster MessagePort }
- ReplyPort : tMsgPort; { Zweiter MessagePort }
- OldPort : pMsgPort; { Schon existierenden Port }
- MsgSend : tMessage; { Message zum Senden }
- MsgReceive: pMessage; { Empfangene Message }
- Dummy : pMessage;
- PortName : string;
- PortCName : ARRAY [1..40] OF BYTE;
- NodeName : string;
- NodeCName : ARRAY [1..40] OF BYTE;
-
- {****************************************************}
- { OpenIntuitionLib(version); }
- { Öffnet die Intuition-Library }
- { Liefert TRUE oder FALSE. }
- {****************************************************}
- FUNCTION OpenIntuitionLib(version:INTEGER):BOOLEAN;
- BEGIN
- IntuitionBase:=pIntuitionBase(OpenLibrary
- ('intuition.library',version));
- IF IntuitionBase=NIL THEN
- OpenIntuitionLib:=FALSE
- ELSE
- OpenIntuitionLib:=TRUE;
- END;
-
- {****************************************************}
- { OpenNewWindow(....); }
- { Öffnet ein Fenster und liefert den Zeiger aufs }
- { Fenster }
- {****************************************************}
- FUNCTION OpenNewWindow(
- WLeftEdge,WTopEdge,WWidth,WHeight: INTEGER;
- WDetailPen,WBlockPen: shortint;
- WIDCMPFlags,WFlags: long;
- WFirstGadget: pGadget;
- WCheckMark: pImage;
- WTitle: string;
- WScreen: pScreen;
- WBitMap: pBitMap;
- WMinWidth,WMinHeight: INTEGER;
- WMaxWidth,WMaxHeight,WType_: word;
- TitleMode:BOOLEAN):pWindow;
- VAR TempWindow : tNewWindow;
- TempTitle : ARRAY [1..80] OF byte;
- BEGIN
- WITH TempWindow DO
- BEGIN
- LeftEdge :=WLeftEdge;
- TopEdge :=WTopEdge;
- Width :=WWidth;
- Height :=WHeight;
- DetailPen :=WDetailPen;
- BlockPen :=WBlockPen;
- IDCMPFlags :=WIDCMPFlags;
- Flags :=WFlags;
- FirstGadget :=WFirstGadget;
- CheckMark :=WCheckMark;
- Screen :=WScreen;
- BitMap :=WBitMap;
- MinWidth :=WMinwidth;
- MinHeight :=WMinHeight;
- MaxWidth :=WMaxWidth;
- MaxHeight :=WMaxHeight;
- Type_ :=WType_;
- END;
- IF TitleMode THEN
- BEGIN
- PasToC(WTitle,TempTitle);
- TempWindow.Title:=@TempTitle;
- END
- ELSE
- TempWindow.Title:=NIL;
- OpenNewWindow := OpenWindow(@TempWindow);
- END;
-
- {****************************************************}
- { Main }
- {****************************************************}
- BEGIN
- { intuition.library öffnen }
- IF OpenIntuitionLib(0) THEN
- BEGIN
- { Der Name des Message-Ports }
- PortName:='AutoRemove Port';
- { Convert Pascal in C-String }
- PasToC(PortName,PortCName);
- { Überprüfen, ob der Port schon existiert }
- OldPort:=FindPort(@PortCName);
- IF (OldPort<>NIL) THEN
- BEGIN
- Window:=OpenNewWindow(
- 100,150,300,45,2,3,ACTIVEWINDOW,
- SMART_REFRESH OR NOCAREREFRESH,
- NIL,NIL,'^ AutoRemove Already Started',
- NIL,NIL,10,10,640,256,WBENCHSCREEN,TRUE);
-
- { Neuen Port einrichten }
- NodeName:='AutoRemove Reply';
- { ...und in C-String konvertieren }
- PasToC(NodeName,NodeCName);
-
- { Initialisieren }
- ReplyPort.mp_Node.ln_Pri:=0;
- ReplyPort.mp_Node.ln_Name:=@NodeCName;
- ReplyPort.mp_SigTask:=pTask(FindTask(NIL));
- { Den Port dem Betriebssystem mitteilen }
- AddPort(@ReplyPort);
-
- { Initialisieren einer Botschaft }
- MsgSend.mn_length:=SizeOf(tMessage);
- MsgSend.mn_Node.ln_Type:=NT_MESSAGE;
- MsgSend.mn_ReplyPort:=@ReplyPort;
- { An den schon bekannten Port verschicken }
- PutMsg(OldPort,@MsgSend);
-
- { Auf Bestätigung warten }
- MsgReceive:=WaitPort(@ReplyPort);
- { Port entfernen }
- RemPort(@ReplyPort);
- Delay(2000);
- CloseWindow(window);
- END
- ELSE
- BEGIN
- Window:=OpenNewWindow(
- 100,100,300,45,2,3,ACTIVEWINDOW,
- SMART_REFRESH OR NOCAREREFRESH,
- NIL,NIL,'AutoRemove Started',NIL,NIL,
- 10,10,640,256,WBENCHSCREEN,TRUE);
- IF Window<>NIL THEN
- BEGIN
- { Initialisieren des Ports }
- NewPort.mp_Node.ln_Pri:=0;
- NewPort.mp_Node.ln_Name:=@PortCName;
- NewPort.mp_SigTask:=pTask(FindTask(NIL));
- AddPort(@NewPort);
-
- { Auf Nachricht warten }
- Dummy:=WaitPort(@NewPort);
- { Nachricht abholen }
- MsgReceive:=GetMsg(@NewPort);
- { Nachricht beantworten }
- ReplyMsg(MsgReceive);
- { Port entfernen }
- RemPort(@NewPort);
- { Kurze Pause }
- Delay(2000);
- CloseWindow(Window);
- END;
- END;
- CloseLibrary(pLibrary(IntuitionBase));
- END;
- END.
-